/// 大文件TS到MP4转换器
/// Author: Lily
/// 针对250MB大文件的专门转换工具

// use std::env;
use std::fs;
use std::io::Read;
use std::path::Path;
use std::time::Instant;

// 导入转换器库
use videoDownloader::converter::{TsToMp4Converter, MediaConverter, ConversionOptions};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("🎬 大文件TS到MP4专用转换器");
    println!("================================");
    println!("Author: Lily");
    println!("专为处理大型TS文件设计");
    println!("");
    
    // 配置参数
    let input_file = "video_real_test.ts";
    let output_file = "video_big_converted.mp4";
    
    // 检查输入文件
    if !Path::new(input_file).exists() {
        eprintln!("❌ 错误：找不到输入文件 {}", input_file);
        eprintln!("💡 请确保 video_real_test.ts 文件存在于当前目录");
        return Ok(());
    }
    
    // 获取文件信息
    let metadata = fs::metadata(input_file)?;
    let file_size_mb = metadata.len() as f64 / (1024.0 * 1024.0);
    
    println!("📁 输入文件: {}", input_file);
    println!("📊 文件大小: {:.2} MB", file_size_mb);
    println!("🎯 输出文件: {}", output_file);
    println!("");
    
    // 开始计时
    let overall_start = Instant::now();
    
    // 第一步：读取文件
    println!("📖 第1步：读取TS文件数据...");
    let read_start = Instant::now();
    
    let mut file = fs::File::open(input_file)?;
    let mut buffer = Vec::new();
    file.read_to_end(&mut buffer)?;
    
    let read_duration = read_start.elapsed();
    println!("✅ 文件读取完成，耗时: {:.2} 秒", read_duration.as_secs_f64());
    println!("📊 读取速度: {:.2} MB/s", file_size_mb / read_duration.as_secs_f64());
    println!("");
    
    // 第二步：创建转换器
    println!("🔧 第2步：创建TS到MP4转换器...");
    let mut converter = TsToMp4Converter::new(65536); // 64KB 缓冲区，适合大文件
    println!("✅ 转换器创建完成，使用64KB缓冲区");
    println!("");
    
    // 第三步：添加数据
    println!("➕ 第3步：添加数据到转换器...");
    let add_start = Instant::now();
    
    converter.add_data(&buffer);
    
    let add_duration = add_start.elapsed();
    println!("✅ 数据添加完成，耗时: {:.2} 秒", add_duration.as_secs_f64());
    println!("📊 处理速度: {:.2} MB/s", file_size_mb / add_duration.as_secs_f64());
    println!("");
    
    // 第四步：执行转换
    println!("🎬 第4步：开始MP4转换过程...");
    println!("⚠️  大文件转换可能需要较长时间，请耐心等待...");
    let convert_start = Instant::now();
    
    // 使用MP4输出选项
    let options = ConversionOptions {
        output_format: "mp4".to_string(),
        quality: None,
        preserve_encoding: true,
        custom_params: vec![],
    };
    
    converter.convert_with_options(Path::new(output_file), &options).await?;
    
    let convert_duration = convert_start.elapsed();
    println!("✅ MP4转换完成，耗时: {:.2} 秒", convert_duration.as_secs_f64());
    println!("");
    
    // 第五步：验证结果
    println!("🔍 第5步：验证转换结果...");
    
    if Path::new(output_file).exists() {
        let output_metadata = fs::metadata(output_file)?;
        let output_size_mb = output_metadata.len() as f64 / (1024.0 * 1024.0);
        let compression_ratio = output_size_mb / file_size_mb * 100.0;
        
        println!("✅ 转换成功完成！");
        println!("");
        println!("📈 转换结果统计:");
        println!("   📄 输出文件: {}", output_file);
        println!("   📊 输出大小: {:.2} MB", output_size_mb);
        println!("   📉 数据保留率: {:.1}%", compression_ratio);
        
        // 验证文件格式
        let mut output_file_handle = fs::File::open(output_file)?;
        let mut header = [0u8; 12];
        output_file_handle.read_exact(&mut header)?;
        
        if &header[4..8] == b"ftyp" {
            println!("   ✅ MP4文件头格式正确");
            if &header[8..12] == b"isom" {
                println!("   ✅ MP4品牌标识正确 (isom)");
            }
        } else {
            println!("   ⚠️  MP4文件头验证失败");
        }
        
        // 总体统计
        let total_duration = overall_start.elapsed();
        println!("");
        println!("⏱️  总体性能统计:");
        println!("   🕒 总耗时: {:.2} 秒", total_duration.as_secs_f64());
        println!("   📊 整体处理速度: {:.2} MB/s", file_size_mb / total_duration.as_secs_f64());
        
        // 评估数据保留效果
        if compression_ratio > 80.0 {
            println!("   🎉 数据保留效果: 优秀 (>80%)");
        } else if compression_ratio > 50.0 {
            println!("   👍 数据保留效果: 良好 (>50%)");
        } else if compression_ratio > 20.0 {
            println!("   ⚠️  数据保留效果: 一般 (>20%)");
        } else {
            println!("   ❌ 数据保留效果: 较差 (<20%)");
        }
        
        println!("");
        println!("🎉 大文件转换完成！");
        println!("💡 建议使用以下工具测试播放效果：");
        println!("   - VLC播放器: vlc {}", output_file);
        println!("   - FFplay: ffplay {}", output_file);
        println!("   - MediaInfo: mediainfo {}", output_file);
        println!("   - FFprobe: ffprobe -v quiet -print_format json -show_format {}", output_file);
        
    } else {
        println!("❌ 转换失败：输出文件未生成");
        return Err("转换失败".into());
    }
    
    Ok(())
}